#ifndef _RpcServer_H__
#define _RpcServer_H__
#include "google/protobuf/service.h"
#include "ZooKeeperClient.h"
#include<muduo/net/TcpServer.h>
#include<muduo/net/EventLoop.h>
#include<muduo/net/InetAddress.h>
#include<muduo/net/TcpConnection.h>
#include<google/protobuf/descriptor.h>
#include<functional>
#include<string>
#include<unordered_map>

namespace EasyRpc{
    class RpcServer {
        public:
            // 这里是提供给外部使用的，可以发布rpc方法的函数接口。
            void NotifyService(google::protobuf::Service* service);
            ~RpcServer();
            
            // 启动rpc服务节点，开始提供rpc远程网络调用服务
            void Run();
        private:
            muduo::net::EventLoop event_loop;
            struct ServiceInfo {
                google::protobuf::Service* service;
                std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> method_map;
            };
            std::unordered_map<std::string, ServiceInfo> service_map; // 保存服务对象和rpc方法
            
            void OnConnection(const muduo::net::TcpConnectionPtr& conn);
            void OnMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buffer, muduo::Timestamp receive_time);
            void SendRpcResponse(const muduo::net::TcpConnectionPtr& conn, google::protobuf::Message* response);
        };
}


#endif





